chore(deps): update dependency axios to v1.16.0 [security]#584
Open
renovate[bot] wants to merge 1 commit into
Open
chore(deps): update dependency axios to v1.16.0 [security]#584renovate[bot] wants to merge 1 commit into
renovate[bot] wants to merge 1 commit into
Conversation
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
This PR contains the following updates:
1.15.2→1.16.0Axios has a Patch Bypass: Proxy-Authorization Header Injection via Prototype Pollution — Incomplete Null-Prototype Fix
CVE-2026-44489 / GHSA-654m-c8p4-x5fp
More information
Details
[Patch Bypass] Proxy-Authorization Header Injection via Prototype Pollution — Incomplete Null-Prototype Fix in Axios 1.15.2
Summary
The
Object.create(null)fix introduced in Axios 1.15.2 (GHSA-q8qp-cvcw-x6jj) protects the top-level config object from prototype pollution. However, nested objects created byutils.merge()(e.g.,config.proxy) are still constructed as plain{}withObject.prototypein their chain.The
setProxy()function atlib/adapters/http.js:209-223readsproxy.username,proxy.password, andproxy.authwithouthasOwnPropertychecks. WhenObject.prototype.usernameis polluted,setProxy()constructs aProxy-Authorizationheader with attacker-controlled credentials and injects it into every proxied HTTP request.Severity: Medium (CVSS 5.4)
Affected Versions: 1.15.2 (and potentially 1.15.1)
Vulnerable Component:
lib/adapters/http.js(setProxy()) +lib/utils.js(merge())CWE
CVSS 3.1
Score: 5.6 (Medium)
Vector:
CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:L/I:L/A:Lconfig.proxy. Unlike GHSA-q8qp-cvcw-x6jj which affected all requests unconditionallyconfig.baseURLhijack)Why This Is Lower Severity Than GHSA-q8qp-cvcw-x6jj (7.4 High)
config.proxysetconfig.baseURLPPconfig.authPPAuthorizationto target serverProxy-Authorizationto proxyThis Is a Patch Bypass
This vulnerability bypasses the fix introduced in Axios 1.15.2 for GHSA-q8qp-cvcw-x6jj. The fix correctly uses
Object.create(null)for the config object, blocking direct prototype pollution onconfig.proxy,config.auth, etc.However, the fix is incomplete: when a user legitimately sets
config.proxy = { host: 'proxy.corp', port: 8080 }, themergeConfig()function passes this object throughutils.merge(), which creates a new plain{}object (lib/utils.js:406: const result = {};). This new object inherits fromObject.prototype, re-opening the prototype pollution attack surface on the nested proxy object.config(top-level)Object.create(null)config.proxy(nested)utils.merge()→const result = {}setProxy()readsproxy.username,proxy.authwithouthasOwnPropertyRoot Cause Analysis
Step 1:
utils.merge()creates plain{}for nested objectsFile:
lib/utils.js, line 406When
mergeConfig()processesconfig.proxy,getMergedValue()callsutils.merge(), which creates a plain{}for the nested object. This plain object inherits fromObject.prototype.Step 2:
setProxy()reads proxy properties withouthasOwnPropertyFile:
lib/adapters/http.js, lines 209-223Complete Attack Chain
Proof of Concept
Reproduction Environment
Reproduction Steps
Verified PoC Output
Confirming the Bypass Mechanism
Fix 2: Use null-prototype objects in
utils.merge()Fix 3 (Comprehensive): Apply null-prototype to all objects created by
getMergedValue()References
Severity
CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:N/I:L/A:NReferences
This data is provided by the GitHub Advisory Database (CC-BY 4.0).
Axios: Proxy-Authorization Credential Leak to Origin Server Across HTTP-to-HTTPS Redirect in Axios Node.js HTTP Adapter
CVE-2026-44487 / GHSA-p92q-9vqr-4j8v
More information
Details
Summary
Axios’s Node.js HTTP adapter may forward a
Proxy-Authorizationheader to a redirected origin during specific proxy-to-direct redirect flows.This affects Node.js usage, where an initial HTTP request is sent through an authenticated HTTP proxy, redirects are followed, and the redirected URL is no longer proxied. Under affected redirect shapes, the final origin can receive the proxy credential that was intended only for the outbound proxy.
Impact
A malicious or attacker-controlled origin can cause an axios client to disclose its configured proxy credentials if all required conditions are present.
The leak is limited to Node.js HTTP adapter requests. Browser, XHR, fetch, and React Native adapter paths are not affected by this Node-specific proxy handling path.
The practical impact depends on the leaked credentials. If the credential is reusable and the proxy is reachable by the attacker, the attacker may be able to authenticate to that proxy, subject to the proxy’s own network exposure, authorisation policy, and credential scope.
Affected Functionality
Affected functionality requires all of the following:
http://request using an authenticated proxy fromconfig.proxyor proxy environment variables.HTTPS_PROXYor a matchingNO_PROXY.Unaffected functionality includes browser adapters, requests with
maxRedirects: 0, requests without proxy credentials, and redirect flows where the redirect layer stripsProxy-Authorizationbefore axios reconfigures the redirected request.Technical Details
In affected versions,
lib/adapters/http.jsaddsProxy-AuthorizationinsetProxy()when a proxy with credentials is used.Axios also installs redirect proxy handling so redirected requests can re-run proxy resolution. Before the fix, when the redirected request no longer resolved to a proxy,
setProxy()did not clear aProxy-Authorizationheader inherited from the previous request options. Iffollow-redirectsdid not remove that header for the specific redirect shape, the redirected direct request carried the stale proxy credential to the origin.The
1.xfix in commitafca61achangessetProxy(options, configProxy, location, isRedirect)so redirect re-invocation removes every case variant ofProxy-Authorizationbefore applying proxy settings for the next hop. Regression tests intests/unit/adapters/http.test.jscover no-proxy redirects,NO_PROXY, different proxy targets, casing variants, and an end-to-end redirect flow.The
0.xfixed release0.32.0includes a backport-styleremoveProxyAuthorization()guard inlib/adapters/http.js.Proof of Concept of Attack
Safe local outline using dummy credentials:
Expected vulnerable behaviour:
Expected fixed behaviour:
Workarounds
Set
maxRedirects: 0and handle redirects manually, ensuringProxy-Authorizationis not copied to requests that are not sent through the proxy.Avoid using reusable authenticated HTTP proxy credentials for requests to untrusted origins. If exposure is suspected, rotate the proxy credential.
Original Source
Summary
Axios’s Node.js
httpadapter can incorrectly forward a retainedProxy-Authorizationheader to the final HTTPS origin during certain HTTP-to-HTTPS redirect flows.When an initial HTTP request is sent through an authenticated
HTTP_PROXY, and the redirected HTTPS request is sent directly because no proxy applies to the redirected HTTPS URL, Axios retains the staleProxy-Authorizationheader and forwards it to the final origin.Details
The issue occurs during a proxy-to-direct transition across redirects.
When Axios sends an initial HTTP request through an authenticated
HTTP_PROXY, it correctly includesProxy-Authorizationfor the proxy hop. If that response redirects to an HTTPS URL on the same hostname, and no proxy applies to the redirected HTTPS URL, the redirected request is sent directly to the final origin instead of through the proxy.In the affected flow, the final HTTPS origin receives a
Proxy-Authorizationheader value that was intended only for the outbound proxy.Whether the issue is observable depends on how the redirect layer compares the host and port across the redirect. In the affected redirect shape, confidential-header handling does not remove the retained
Proxy-Authorizationheader before the redirected request is sent.Root Cause Analysis
Based on code review, Axios appears to create the stale header condition in its Node.js
httpadapter.In lib/adapters/http.js:
Proxy-Authorizationin setProxy().As a result, Axios correctly adds proxy credentials for the first proxied request, but does not clear them when a later redirected request becomes direct.
A dependent factor is the behavior of the redirect layer. In the affected redirect shape, confidential-header handling does not remove the retained
Proxy-Authorizationheader before the redirected request is sent. This appears to be why the issue is observable only for certain redirect shapes.Client Conditions
HTTP_PROXYHTTPS_PROXYis configured)Under that redirect shape, the retained
Proxy-Authorizationheader is not removed before the redirected request is sent to the final HTTPS origin.Reproduction Outline
Detailed reproduction instructions were shared with the maintainers during coordinated disclosure. The public outline below preserves the validated configuration and observable behavior needed to assess exposure, while omitting environment-specific test-harness details.
The issue was reproduced only in a researcher-controlled local test environment using dummy proxy credentials.
The issue was confirmed under the following conditions:
Observed behavior
Proxy-Authorization.Proxy-Authorizationheader.Proxy-Authorizationheader value that was intended only for the proxy.Expected behavior
Axios should not send the
Proxy-Authorizationheader on a redirected request that is no longer sent through a proxy.Impact
Under the affected redirect and proxy configuration, the final HTTPS origin may receive a retained
Proxy-Authorizationheader value that was intended only for the outbound proxy.If that credential is valid and reusable, and the outbound proxy is reachable by the attacker, the attacker may be able to authenticate to that proxy with the affected environment’s proxy credential, subject to the credential’s scope and the proxy’s access controls.
Severity
CVSS:4.0/AV:N/AC:L/AT:P/PR:N/UI:N/VC:H/VI:N/VA:N/SC:N/SI:N/SA:NReferences
This data is provided by the GitHub Advisory Database (CC-BY 4.0).
Axios: Proxy-Authorization header leaks to redirect target when proxy is re-evaluated to direct connection
CVE-2026-44486 / GHSA-j5f8-grm9-p9fc
More information
Details
Summary
Axios’ Node.js HTTP adapter can leak proxy credentials to a redirect target in affected versions. When a request is sent through an authenticated proxy, Axios may add a
Proxy-Authorizationheader. If Axios then follows a redirect and the redirected request is no longer sent through that proxy, the staleProxy-Authorizationheader can remain on the redirected request and be sent to the redirect target.This affects Node.js's use of Axios with automatic redirects enabled and an authenticated proxy configuration. Browser adapters are not affected.
Impact
An attacker who controls a server that the victim application requests can redirect the request so that the attacker-controlled redirect target receives the victim’s proxy credentials.
The most relevant case is a Node.js application using an authenticated
HTTP_PROXYfor an initialhttp://request, with redirects enabled, where the redirect target resolves to no proxy, such as anhttps://URL whenHTTPS_PROXYis unset.This does not affect browser, XHR, or fetch adapter behaviour. It also does not affect requests with
maxRedirects: 0.Affected Functionality
Affected functionality is limited to the Node.js HTTP adapter in
lib/adapters/http.js.Relevant inputs and settings include:
HTTP_PROXY,HTTPS_PROXY, andNO_PROXY.http://user:pass@proxy.example:8080.follow-redirects.setProxy().beforeRedirects.proxy.Technical Details
In affected v1 releases,
setProxy()addsProxy-Authorizationwhen a proxy with credentials is selected, but redirect handling callssetProxy()again without first clearing any existing proxy authorization header.If the redirected URL resolves to no proxy,
setProxy()does not add a new proxy configuration and also does not remove the old header. The redirected request can therefore carry the staleProxy-Authorizationheader to the final origin.The v1 fix in
afca61aadds anisRedirectpath that deletes any case variant ofProxy-Authorizationbefore proxy settings are re-applied on redirect. The v0 backport in2af6116fixed the 0.x line for0.32.0.Proof of Concept of Attack
Attacker-controlled HTTP endpoint:
Expected result on affected versions:
Expected result on fixed versions:
Workarounds
Set
maxRedirects: 0and handle redirects manually.Avoid using authenticated proxy environment variables for requests to untrusted HTTP origins unless redirect behaviour is controlled.
Ensure proxy environment variables are configured consistently across protocols so redirects do not unexpectedly change from proxied to direct connections.
Original Source
Summary
Axios' Node.js HTTP adapter can leak proxy credentials to a redirect target origin. When an initial request is sent through an authenticated HTTP proxy, Axios adds a
Proxy-Authorizationheader. On redirect, Axios re-evaluates proxy settings, but if the redirected request no longer uses a proxy, the staleProxy-Authorizationheader is not cleared. As a result, the redirect target can receive the proxy credential directly.This issue affects the Node.js HTTP adapter and can be reproduced when the initial request uses
HTTP_PROXYwith authentication, redirects are enabled, and the redirected request is resolved to no proxy, such as whenHTTPS_PROXYis unset or the redirect target is excluded byNO_PROXY.Details
In the current implementation:
setProxy()addsProxy-Authorizationwhen a proxy with credentials is in use.setProxy()for the redirected request.setProxy()does not clear the previously addedProxy-Authorizationheader.Relevant code locations:
lib/adapters/http.jssetProxy()addsProxy-AuthorizationbeforeRedirects.proxyPoC
GET http://<attacker-site>/startcorp proxy302 Location: https://<attacker-site>/finalProxy-AuthorizationheaderObserved output:
This demonstrates that the proxy credential is exposed to the redirect target origin.
Impact
Exposes authenticated proxy credentials to an attacker-controlled origin.
Severity
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:N/A:NReferences
This data is provided by the GitHub Advisory Database (CC-BY 4.0).
Release Notes
axios/axios (axios)
v1.16.0Compare Source
v1.16.0 — May 2, 2026
This release adds support for the QUERY HTTP method and a new
ECONNREFUSEDerror constant, lands a substantial wave of HTTP, fetch, and XHR adapter bug fixes around redirects, aborts, headers, and timeouts, and welcomes 23 new contributors.A handful of fixes in this release are either security-adjacent or change observable behaviour. Please review before upgrading:
maxBodyLengthandmaxContentLength. These limits were silently ignored on the fetch adapter prior to 1.16.0 — anyone relying on them as a safety net (DoS protection, accidental large uploads) had no protection. (#10795)Hostheaders. Previously, the proxy path could overwrite a customHost. Virtual-host-style routing through a proxy will now behave correctly. (#10822)https://user:p%40ss@host), the decoded value is what now goes on the wire. (#10825)parseProtocolnow strictly requires a colon in the protocol separator. Strings that loosely parsed as protocols before may no longer match. (#10729)unescape()replaced with modern UTF-8 encoding. Non-ASCII URL handling is now spec-correct; consumers depending on legacyunescape()quirks may see different output bytes. (#7378)transformRequestinput typing change was reverted. The typing change introduced in #10745 was reverted in #10810 after follow-up review — net behavior is unchanged from 1.15.2. (#10745, #10810)🚀 New Features
ECONNREFUSEDas a constant onAxiosErrorso callers can match connection-refused failures without comparing string literals (closes #6485). (#10680)encodehelper frombuildURLso userland param serializers can reuse the same encoding logic that axios uses internally. (#6897)🐛 Bug Fixes
requestDetailsargument onbeforeRedirect, preserved user-suppliedHostheaders when forwarding through a proxy, and properly URL-decoded basic auth credentials. (#10794, #10800, #6241, #10822, #10825)AxiosErrorwhen a stream is aborted after headers arrive, honoured thetimeoutoption during the connect phase when redirects are disabled, and resolved an unsettled-promise hang when an aborted request was combined with compression andmaxRedirects: 0. (#10708, #10819, #7149)maxBodyLength/maxContentLengthin the fetch adapter, set theUser-Agentheader to match the HTTP adapter, preserved the original abort reason instead of replacing it with a generic error, and deferred global access so importing the module no longer throws aTypeErrorin restricted environments. (#10795, #10772, #10806, #7260)cancelTokenandAbortSignallisteners on the error, timeout, and abort code paths to prevent leaked subscriptions. (#10787)AxiosErrorwhenJSON.parsefails insidedispatchRequest, preventedsettlefrom emittingundefinederror codes, and tightened theparseProtocolregex to require a colon in the protocol separator. (#10724, #7276, #10729)CancelTokentypings with the ESM build, fixed a compiler error caused byRawAxiosHeaders, and re-exportedcreatefrom the package index. (#7414, #6389, #6460)unescape()call with a modern UTF-8 encoding implementation. (#7378)🔧 Maintenance & Chores
utilsmodule and XHR adapter to use ES6 features, and tidied the multipart boundary error message. (#10588, #7419)FormDataEPIPE failures, fixed Win32 platform support for the pipe tests, and corrected an incorrect test assumption. (#10820, #10791, #10796)paramsSerializer.encodefor strict RFC 3986 query encoding, updated theparseReviverTypeScript definitions and configuration docs for ES2023, added timeout guidance to the README's first async example, and expanded notes around the recent type changes. (#10821, #10782, #10759, #10804)transformRequestinput typing change from #10745 after follow-up review. (#10745, #10810)actions/setup-node, thegithub-actionsgroup, andpostcss(in/docs) to their latest versions. (#10785, #10813, #10814)🌟 New Contributors
We are thrilled to welcome our new contributors. Thank you for helping improve axios:
Full Changelog
Configuration
📅 Schedule: (UTC)
🚦 Automerge: Disabled by config. Please merge this manually once you are satisfied.
♻ Rebasing: Whenever PR is behind base branch, or you tick the rebase/retry checkbox.
🔕 Ignore: Close this PR and you won't be reminded about this update again.
This PR was generated by Mend Renovate. View the repository job log.